#ifndef OWNERSTACK_H
#define OWNERSTACK_H
template<class T> class Stack{
    struct Link{
      T* data;
      Link* next;
      Link(T* dat,Link* nxt):data(dat),next(nxt){}  
    }*head;
   bool own;
   public:
   Stack(bool own = true):head(0),own(own){

   }
   ~Stack();
   void push(T* dat){
       head =new Link(dat,head);
   } 
   T* peek() const{
     return head? head->data:0;
   }
   T* pop();
   bool owns() const{
     return own;
   }
   void owns(bool newownership){
    own=newownership;
   }
   operator bool() const{
    return head !=0;
   } 
};

template<class T> T* Stack<T>::pop(){
    if(head==0)return 0;
    T* result =head ->data;
    Link* oldHead =head;
    head=head->next;
    delete oldHead;
    return result;
}

template<class T> T* Stack<T>::~Stack(){
    if(!own) return;
    while(head){
        delete pop();
    }
}
#endif  //OWNERSTACK_H ///:~